package util;

import Controller.InterceptInterface;
import information.Information;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;


/**
 * 得到存放所有方法的map集合 和 list赋值
 */
public class InitMap {
    //单例
    private InitMap(){}
    private static Map<String, Information> map=new HashMap<String,Information>();
    private static List<InterceptInterface> list=new ArrayList<InterceptInterface>();

    public static Map<String, Information> getMap(){
        //得到一个存放了所有方法的map集合
        init();
        return map;
    }
    public static List<InterceptInterface> getList(){
        //保证每次的拦截器容器都是新的
        return list;
    }

    public static void init(){
        //获取map后清空list 这两句没用
        list.clear();
        map.clear();
        List<String> beanName = null;
        try {
            beanName = Scan.getBeanName();
            for(String bean:beanName){
                if(!(bean.startsWith("util."))){
                    Class<?> clazz = Class.forName(bean);
                    //如果继承了InterceptInterface类
                    if(InterceptInterface.class.isAssignableFrom(clazz)){
                        initInterceptor(clazz);
                    }else {
                        initMap(clazz);
                    }
                }
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 给 map 赋值
     * 键值为类的字母小写后再去掉Handler这段字符
     * 值为Information对象 对象中有 实例 ，方法名
     */
    private static void initMap(Class<?> clazz){
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(int i=0;i<declaredMethods.length;i++){
            Information information = new Information();
            information.setMethod(declaredMethods[i]);
            information.setClazz(clazz);
            //键值首字母小写去掉
            map.put(clazz.getSimpleName().substring(0,1).toLowerCase()+
                    clazz.getSimpleName().substring(1).replace("Handler","")+
                    declaredMethods[i].getName(),information);
        }
    }

    /**
     * 初始化存放拦截器对象的list集合
     * @param clazz
     */
    private static void initInterceptor(Class<?> clazz){
        try {
            list.add((InterceptInterface) clazz.newInstance());
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
